// 一个最小可运行的 UDP 客户端。
// - 向 127.0.0.1:5678 发送数据
// - 读取服务端回显
package main

import (
	"fmt"
	"log"
	"net"
	"time"
)

func main() {
	// 1. DialTimeout 会：
	//    - 在 10 秒超时内建立“伪连接”
	//    - 记录远端（服务器）地址
	//    - 为客户端分配一个随机本地端口
	conn, err := net.DialTimeout("udp", "127.0.0.1:5678", 10*time.Second)
	if err != nil {
		log.Fatalf("dial udp error: %v", err)
	}
	defer conn.Close()

	log.Printf("客户端本地地址：%s，服务器地址：%s",
		conn.LocalAddr(), conn.RemoteAddr())

	// 2. 直接调用 Write 发送报文。UDP 不会确认对方是否收到。
	msg := []byte("hello, UDP")
	n, err := conn.Write(msg)
	if err != nil {
		log.Fatalf("write error: %v", err)
	}
	log.Printf("已发送 %d 字节", n)

	// 3. 设置读取超时，避免服务端未响应时一直阻塞。
	if err := conn.SetReadDeadline(time.Now().Add(5 * time.Second)); err != nil {
		log.Fatalf("set deadline error: %v", err)
	}

	reply := make([]byte, 256)
	n, err = conn.Read(reply)
	if err != nil {
		log.Fatalf("read error: %v", err)
	}
	fmt.Printf("收到回显：%q\n", string(reply[:n]))
}
